package vista.paneles;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

import vista.objetos.FabricaAtributoGraficable;
import vista.objetos.FabricaAtributoGraficableCompuesto;
import vista.ventanas.ConstantesVista;

@SuppressWarnings("serial")
public class PanelComposicionAtributo extends JPanel {
		
	private JRadioButton buttonSimple;
	private JRadioButton buttonCompuesto;
	private ButtonGroup buttonGroupComposicion;
	private PanelAtributo panelAtributo;
	private PanelTipoAtributo panelTipo;
	
	public PanelComposicionAtributo(PanelAtributo panel) 
	{
		super();
		
		this.setBorder(BorderFactory.createTitledBorder("Composicion"));

		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWeights = new double[]{1.0};
		gridBagLayout.columnWidths = new int[]{0};
		gridBagLayout.rowWeights = new double[]{1.0, 1.0, 1.0};
		gridBagLayout.rowHeights = new int[]{0, 0, 0};
		this.setLayout(gridBagLayout);
		
		this.panelAtributo = panel;
		
		agregarComponentes();
		agregarEventosParaVisibilidad();
		botonAtributoSimpleActivado();
	}

	/* para los datos */
	public String getExpresion() {
		return this.panelTipo.getExpresion();
	}
	
	public void setExpresion(String expresion) {
		this.panelTipo.setExpresion(expresion);
	}
	
	public FabricaAtributoGraficable getTipoAtributo()
	{
		if (buttonSimple.isSelected())
			return this.panelTipo.getSeleccionDeTipo();
		return new FabricaAtributoGraficableCompuesto();
	}
	
	public void seleccionarTipoAtributoSimple(String tipo) throws ElementoNoExistenteException {
		this.panelTipo.setSeleccionDeTipo(tipo);
	}

	public PanelAtributo getPanelAtributo() {
		return panelAtributo;
	}
	
	public void seleccionarAtributoSimple(){
		botonAtributoSimpleActivado();
	}
	
	public void seleccionarAtributoCompuesto(){
		botonAtributoCompuestoActivado();
	}
	
	/*para los eventos*/
	private void agregarEventosParaVisibilidad()
	{
		buttonSimple.addActionListener(new ActionListener()	{
			@Override
			public void actionPerformed(ActionEvent arg0){
				botonAtributoSimpleActivado();
			}
		});
		
		buttonCompuesto.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0){
				botonAtributoCompuestoActivado();				
			}
		});
	}
	
	private void botonAtributoSimpleActivado() 
	{
		buttonSimple.setSelected(true);
		panelAtributo.setEnabled(false);
		panelTipo.setEnabled(true);
	}
	
	private void botonAtributoCompuestoActivado() 
	{
		buttonCompuesto.setSelected(true);
		panelAtributo.setEnabled(true);
		panelTipo.setEnabled(false);
	}
	
	/*para dibujar*/
	public void agregarTipoAtributo(List<FabricaAtributoGraficable> tiposAtributo)
	{
		panelTipo.agregarTiposDeAtributo(tiposAtributo);
	}
	
	private void agregarPanelAtributo() 
	{
		GridBagConstraints gbc_panelAtributo = new GridBagConstraints();
		gbc_panelAtributo.insets = new Insets(0, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL/4, ConstantesVista.SUBPANEL_MARGEN_VERTICAL, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL/4);
		gbc_panelAtributo.fill = GridBagConstraints.BOTH;
		gbc_panelAtributo.gridx = 0;
		gbc_panelAtributo.gridy = 3;
		
		this.add(panelAtributo, gbc_panelAtributo);
	}
	
	private void agregarPanelTipoAtributo()
	{
		panelTipo = new PanelTipoAtributo();
		
		GridBagConstraints gbc_panelTipo = new GridBagConstraints();
		gbc_panelTipo.fill = GridBagConstraints.BOTH;
		gbc_panelTipo.insets = new Insets(0, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL/4, ConstantesVista.SUBPANEL_MARGEN_VERTICAL, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL/4);
		gbc_panelTipo.gridx = 0;
		gbc_panelTipo.gridy = 1;
		
		this.add(panelTipo, gbc_panelTipo);
	}
	
	private void agregarComponentes() 
	{
		buttonGroupComposicion = new ButtonGroup();

		buttonSimple = new JRadioButton(ConstantesVista.ATRIBUTO_SIMPLE, true);
		agregarBotonDeOpcion(buttonSimple, 0);
		
		agregarPanelTipoAtributo();
		
		buttonCompuesto = new JRadioButton(ConstantesVista.ATRIBUTO_COMPUESTO, false);
		agregarBotonDeOpcion(buttonCompuesto, 2);
		
		agregarPanelAtributo();
	}

	private void agregarBotonDeOpcion(JRadioButton buttonOpt, int nroFila)
	{
		GridBagConstraints gbc_buttonOpt = new GridBagConstraints();
		gbc_buttonOpt.insets = new Insets(0, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL, ConstantesVista.SUBPANEL_MARGEN_VERTICAL, ConstantesVista.SUBPANEL_MARGEN_HORIZONTAL);
		gbc_buttonOpt.fill = GridBagConstraints.BOTH;
		gbc_buttonOpt.gridx = 0;
		gbc_buttonOpt.gridy = nroFila;
		
		this.add(buttonOpt, gbc_buttonOpt);
				
		buttonGroupComposicion.add(buttonOpt);
	}
}
